package com.ruoyi.common.oss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.model.ObjectMetadata;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.net.URL;
import java.util.Date;

@Component
@Slf4j
public class OssManager {


    @Value("${oss.bucketName}")
    private String bucketName;

    @Value("${oss.endpoint}")
    private String endpoint;

    @Value("${oss.accessKeyId}")
    private String accessKeyId;

    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;

    private OSS ossClient;

    @PostConstruct
    public void initOssClient() {
        // 使用代码嵌入的RAM用户的访问密钥配置访问凭证。
        CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
        // 创建OSSClient实例。
        ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
        log.info("initOssClient finished.");

        // 从环境变量中获取访问凭证。运行本代码示例之前，请先配置环境变量。
//        EnvironmentVariableCredentialsProvider environmentVariableCredentialsProvider = null;
//        try {
//            environmentVariableCredentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
//            // 创建OSSClient实例。
//            ossClient = new OSSClientBuilder().build(endpoint, environmentVariableCredentialsProvider);
//            log.info("initOssClient finished.");
//        } catch (ClientException e) {
//            throw new RuntimeException(e);
//        }
    }

    @PreDestroy
    public void destroy() {
        if (ossClient != null) {
            ossClient.shutdown();
            ossClient = null;
        }
    }


    /**
     * 获取文件的全部元信息。
     * 依次填写Bucket名称以及Object的完整路径。
     *
     * @param objectName
     */
    public void getObjectMetadata(String objectName) {
        if (ossClient == null) return ;
        // 获取文件的全部元信息。
        ObjectMetadata metadata = ossClient.getObjectMetadata(bucketName, objectName);
        log.info("getObjectMetadata metadata: {}", metadata);
    }

    /**
     * 生成以GET方法访问的签名URL，访客可以直接通过浏览器访问相关内容。
     *
     * @param objectName
     */
    public URL generatePresignedUrl(String objectName) {
        if (ossClient == null) return null;
        // 设置签名URL过期时间，单位为毫秒。本示例以设置过期时间为1小时为例。
        Date expiration = new Date(new Date().getTime() + 3600 * 1000L);
        return ossClient.generatePresignedUrl(bucketName, objectName, expiration);
    }

}
